import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 * A RandomArtPanel draws random pictures which might be taken to have some
 * vague resemblance to abstract art. A new picture is produced every four
 * seconds. There are three types of pictures: random lines, random circles, and
 * random 3D rects. The figures are drawn in random colors on a background that
 * is a random shade of gray.
 */
public class RandomArtPanel extends JPanel {

	/**
	 * A RepaintAction object calls the repaint method of this panel each time
	 * its actionPerformed() method is called. An object of this type is used as
	 * an action listener for a Timer that generates an ActionEvent every four
	 * seconds. The result is that the panel is redrawn every four seconds.
	 */
	private class RepaintAction implements ActionListener {
		public void actionPerformed(ActionEvent evt) {
			repaint(); // Call the repaint() method in the panel class.
		}
	}

	/**
	 * The constructor creates a timer with a delay time of four seconds (4000
	 * milliseconds), and with a RepaintAction object as its ActionListener. It
	 * also starts the timer running.
	 */
	public RandomArtPanel() {
		RepaintAction action = new RepaintAction();
		Timer timer = new Timer(4000, action);
		timer.start();
	}

	/**
	 * The paintComponent() method fills the panel with a random shade of gray
	 * and then draws one of three types of random "art". The type of art to be
	 * drawn is chosen at random.
	 */
	public void paintComponent(Graphics g) {

		// Note: Since the next three lines fill the entire panel with
		// gray, there is no need to call super.paintComponent(g), since
		// any drawing that it does will only be covered up anyway.

		Color randomGray = Color.getHSBColor(1.0F, 0.0F, (float) Math.random());
		g.setColor(randomGray);
		g.fillRect(0, 0, getWidth(), getHeight());

		int artType = (int) (3 * Math.random());

		switch (artType) {
		case 0:
			for (int i = 0; i < 500; i++) {
				int x1 = (int) (getWidth() * Math.random());
				int y1 = (int) (getHeight() * Math.random());
				int x2 = (int) (getWidth() * Math.random());
				int y2 = (int) (getHeight() * Math.random());
				Color randomHue = Color.getHSBColor((float) Math.random(),
						1.0F, 1.0F);
				g.setColor(randomHue);
				g.drawLine(x1, y1, x2, y2);
			}
			break;
		case 1:
			for (int i = 0; i < 200; i++) {
				int centerX = (int) (getWidth() * Math.random());
				int centerY = (int) (getHeight() * Math.random());
				Color randomHue = Color.getHSBColor((float) Math.random(),
						1.0F, 1.0F);
				g.setColor(randomHue);
				g.drawOval(centerX - 50, centerY - 50, 100, 100);
			}
			break;
		case 2:
			for (int i = 0; i < 25; i++) {
				int centerX = (int) (getWidth() * Math.random());
				int centerY = (int) (getHeight() * Math.random());
				int size = 30 + (int) (170 * Math.random());
				Color randomColor = new Color((int) (256 * Math.random()),
						(int) (256 * Math.random()),
						(int) (256 * Math.random()));
				g.setColor(randomColor);
				g.fill3DRect(centerX - size / 2, centerY - size / 2, size,
						size, true);
			}
			break;
		}

	} // end paintComponent()

} // end class RandomArtPanel